home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / listings / v_09_08 / 9n08078a < prev    next >
Text File  |  1990-12-03  |  1KB  |  53 lines

  1. /*********** EXCEPT.H COPYRIGHT 1990 GREGORY COLVIN ************
  2. This program may be distributed free with this copyright notice.
  3. ***************************************************************/
  4. #include <stdlib.h>
  5. #include <errno.h>
  6. #include <assert.h>
  7. #include <signal.h>
  8. #include <setjmp.h>
  9.  
  10. typedef struct x_trap {
  11.     struct x_trap *next;
  12.     jmp_buf context;
  13. } X_TRAP;
  14.  
  15. typedef enum {
  16.     X_ERRNO=-1, X_ASSERT=-2, X_SIGNAL=-3, X_SYSTEM=-4, X_USER=-5
  17. } XCEPTION;
  18.  
  19. extern X_TRAP *X_Trap;
  20. extern XCEPTION X_Error;
  21. extern volatile sig_atomic_t X_Signal;
  22.  
  23. extern void X_TrapError( void );
  24. extern void X_HandleSignal( int sig );
  25. extern void X_ReturnSignal( int sig );
  26.  
  27. #define BEGIN_TRY                                   \
  28. { X_TRAP trap;                                      \
  29.   trap.next = X_Trap; X_Trap = &trap; X_Signal = 0; \
  30.   TRY: if (!(X_Error = setjmp(trap.context)))
  31.  
  32. #define FAIL(error) \
  33.   if (X_Error =(error)) X_TrapError(); else
  34.  
  35. #define FAIL_TRY else
  36.  
  37. #define RETRY if (X_Error) goto TRY
  38.  
  39. #define END_TRY               \
  40.   if (X_Signal && !X_Error)   \
  41.     FAIL(X_SIGNAL);           \
  42.   X_Trap = X_Trap->next;      \
  43.   FAIL(X_Error);              \
  44. }
  45.  
  46. #ifdef XDEBUG
  47.   extern char *X_Assert;
  48.   #undef assert
  49.   #define assert(x) \
  50.     ((x)? (void)0: (X_Assert=#x,X_Error=X_ASSERT,X_TrapError()))
  51.  
  52. #endif
  53.